﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BlackoutRugby.servicios.http;
using servicios.http;
using BlackoutRugby.enums.solicitud;
using BlackoutRugby.entity.partido;
using BlackoutRugby.xml.parser;

namespace BlackoutRugby.servicios.partidos
{
    class ServicioPartidos : BlackoutRugby.serviciosBase.ServicioPartidosBase
    {
        ServicioHttp servHttp;
        private static ServicioPartidos srv;
        private static long idEquipo;
        

        public static ServicioPartidos getInstance(long ie)
        {
            idEquipo = ie;
            if (srv == null)
                return srv = new ServicioPartidos(ie);
            else
            {
                
                return srv.conServiciosActualizados(ie);
            }
        }

        private ServicioPartidos conServiciosActualizados(long ie)
        {

            servHttp = ServicioHttp.getInstance(ie);
            return this;
        }

        private ServicioPartidos(long ie)
        {
            idEquipo = ie;
            servHttp = ServicioHttp.getInstance(ie);

        }

        public override System.Collections.Generic.List<BlackoutRugby.entity.partido.PartidoEntity> recuperarTodosPartidos(long idEquipo)
        {
            List<PartidoEntity> listPartidos = new List<PartidoEntity>();

            List<Parametro> lparams = new List<Parametro>();

            Parametro p1 = new Parametro(Parametro.TipoParametro.PartidosPasados, ""+idEquipo);
            Parametro p2= new Parametro(Parametro.TipoParametro.PartidosFuturos, ""+idEquipo);

            TipoSolicitud sol = new TipoSolicitud(TipoSolicitud.Tipo.Partidos);

            lparams.Add(p1);
            lparams.Add(p2);

            //asdfasdadad
            string respuesta = servHttp.enviarPost(sol, lparams);

            return null;

        }

        public override System.Collections.Generic.List<BlackoutRugby.entity.partido.PartidoEntity> recuperarUltimosPartidos(int numPartidos, long idEquipo)
        {
            List<PartidoEntity> listPartidos = new List<PartidoEntity>();

            List<Parametro> lparams = new List<Parametro>();
            Parametro p1 = new Parametro(Parametro.TipoParametro.UltimosPartidos, "" + numPartidos);
            Parametro p2 = new Parametro(Parametro.TipoParametro.IdEquipo, "" + idEquipo);
            TipoSolicitud sol = new TipoSolicitud(TipoSolicitud.Tipo.Partidos);

            lparams.Add(p1);
            lparams.Add(p2);
         
            
            string respuesta = servHttp.enviarPost(sol, lparams);

            List<PartidoEntity> partidosIncompletos = XmlParser.toPartidoEntityBasico(respuesta);

            foreach (PartidoEntity p in partidosIncompletos)
                listPartidos.Add(completarPartido(p, idEquipo));

            return listPartidos;
        }

        private PartidoEntity completarPartido(PartidoEntity partido, long idEquipo)
        {
            List<Parametro> lparams = new List<Parametro>();
            Parametro p1 = new Parametro(Parametro.TipoParametro.Fixtureid, "" + partido.idPartido);
            TipoSolicitud sol = new TipoSolicitud(TipoSolicitud.Tipo.MarcadorPartido);

            lparams.Add(p1);

            string respuesta = servHttp.enviarPost(sol, lparams);

            XmlParser.completarPartido(respuesta, partido);

            bool esLocal = (partido.idEquipoLocal == idEquipo)? true: false;
            
            if (partido.marcadorLocal == partido.marcadorVisitante)
                partido.resultado = new enums.partido.TipoResultado(enums.partido.TipoResultado.Tipo.Empatado);
            else
                if ((partido.marcadorLocal > partido.marcadorVisitante && esLocal) || (partido.marcadorLocal < partido.marcadorVisitante && !esLocal))
                    partido.resultado = new enums.partido.TipoResultado(enums.partido.TipoResultado.Tipo.Ganado);
                else
                    partido.resultado = new enums.partido.TipoResultado(enums.partido.TipoResultado.Tipo.Perdido);


            return partido;
           
        }

        public System.Collections.Generic.List<BlackoutRugby.entity.partido.PartidoEntity> recuperarPartidosJuveniles(long idEquipo)
        {
            List<PartidoEntity> listPartidos = new List<PartidoEntity>();

            List<Parametro> lparams = new List<Parametro>();
            Parametro p1 = new Parametro(Parametro.TipoParametro.Juvenil, "");
            Parametro p2 = new Parametro(Parametro.TipoParametro.PartidosPasados, ""+idEquipo);
            Parametro p3 = new Parametro(Parametro.TipoParametro.Temporada, "16");

            TipoSolicitud sol = new TipoSolicitud(TipoSolicitud.Tipo.Partidos);
            lparams.Add(p1);
            lparams.Add(p2);


            string respuesta = servHttp.enviarPost(sol, lparams);

            List<PartidoEntity> partidosIncompletos = XmlParser.toPartidoEntityBasico(respuesta);

            /*foreach (PartidoEntity p in partidosIncompletos)
                listPartidos.Add(completarPartido(p, idEquipo));*/

            return partidosIncompletos;

        }



        public List<InfoPartidoEntity> recuperarInfoPartidosJuveniles(long idEquipo)
        {
            List<PartidoEntity> listPartidos = recuperarPartidosJuveniles(idEquipo);

            List<InfoPartidoEntity> listInfo = new List<entity.partido.InfoPartidoEntity>();

            foreach (PartidoEntity partido in listPartidos)
            {
                InfoPartidoEntity infoAux = recuperarInfoPartido(partido.idPartido, true);

                listInfo.Add(infoAux);

            }

            return listInfo;

        }

        private entity.partido.InfoPartidoEntity recuperarInfoPartido(long idPartido, bool esJuvenil)
        {
            List<Parametro> lparams = new List<Parametro>();
            Parametro p1 = new Parametro(Parametro.TipoParametro.Fixtureid, "" + idPartido);
            //Parametro p2 = new Parametro(Parametro.TipoParametro.EstadisticasEquipo, "" + idPartido);
            TipoSolicitud sol = new TipoSolicitud(TipoSolicitud.Tipo.EstadisticasPartido);
            lparams.Add(p1);
            //lparams.Add(p2);

            string respuesta = servHttp.enviarPost(sol, lparams);

            InfoPartidoEntity info = XmlParser.toInfoPartidoEntity(respuesta, esJuvenil, idEquipo);
            return info;
        }

    }
}
